package leetcode.list;

import utils.node.ListNode;

/**
 * DESCRIPTION: https://leetcode-cn.com/problems/remove-linked-list-elements/
 * 给你一个链表的头节点 head 和一个整数 val ，请你删除链表中所有满足 Node.val == val 的节点，并返回 新的头节点 。
 * Author: ammar
 * Date:   2021/12/11
 * Time:   下午1:20
 */
public class _203_移除链表元素 {
    public static void main(String[] args) {
//        ListNode head1 = Tools.generList(new Integer[]{1, 2, 3, 1, 5, 1});
//        ListNode head1 = Tools.generList(new Integer[]{1, 1, 1, 1, 1, 1});
        ListNode head1 = Tools.generList(new Integer[]{1, 2, 2, 1});
        ListNode newhead1 = removeElements(head1, 2);
        System.out.println(newhead1);
    }

    /**
     * 分别考虑 val 在链表头，尾，中三种情况
     * val 出现在表头时，head = head.next，然后continue
     *
     * val 出现在中间时，temp.val = temp.next.val,
     * 然后 temp.next = temp.next.next，删除 temp.next 的值，记得 continue
     *
     * var 出现在结尾时，需要记录前一个节点，然后让 prev.next = null 即可，直接 break
     * @param head
     * @param val
     * @return
     */
    public static ListNode removeElements(ListNode head, int val) {
        ListNode first = new ListNode(0);
        first.next = head;
        ListNode tail = first;
        while (head != null) {
            if (head.val != val) {
                tail = tail.next = head;
            }
            head = head.next;
        }
        tail.next = null;
        return first.next;
    }
}
